package com.tbynet.jwp.model;

import java.util.ArrayList;
import java.util.List;

import com.tbynet.jwp.model.base.BaseUsers;

/**
 * 用户Model
 *
 * 核心职责：
 * 1. 用户基本信息管理
 * 2. 用户元数据关联
 * 3. 会话管理支持
 *
 * 设计原则：
 * - 继承JwpModel获得通用功能
 * - 专注于用户特定的业务方法
 * - 提供便捷的元数据操作方法
 *
 * @author 佰亿互联
 * @version 2.0
 * @since 2025-11-04
 */
@SuppressWarnings("serial")
public class Users extends BaseUsers<Users> {

    /** 数据库操作对象 - 只能用于查询 */
    public static final Users dao = new Users().dao();

    /** 用户元数据列表 */
    private List<Usermeta> metas = new ArrayList<Usermeta>();

    // ========== 缓存常量 ==========

    /** 存放登录用户的 cacheName */
    public static final String loginUserCacheName = "loginUser";

    /** "tbynetId" 仅用于 cookie 名称，其它地方如 cache 中全部用的 "sessionId" 来做 key */
    public static final String sessionIdName = "tbynetId";

    // ========== 元数据设置方法 ==========

    /**
     * 设置昵称
     */
    public Users setNickname(String nickname) {
        Usermeta meta = new Usermeta();
        meta.setNickname(nickname);
        meta.setUserId(getID());
        metas.add(meta);
        return this;
    }

    /**
     * 设置名字
     */
    public Users setFirstName(String firstName) {
        Usermeta meta = new Usermeta();
        meta.setFirstName(firstName);
        meta.setUserId(getID());
        metas.add(meta);
        return this;
    }

    /**
     * 设置姓氏
     */
    public Users setLastName(String lastName) {
        Usermeta meta = new  Usermeta();
        meta.setLastName(lastName);
        meta.setUserId(getID());
        metas.add(meta);
        return this;
    }

    /**
     * 设置描述
     */
    public Users setDescription(String description) {
        Usermeta meta = new Usermeta();
        meta.setDescription(description);
        meta.setUserId(getID());
        metas.add(meta);
        return this;
    }

    /**
     * 设置富文本编辑
     */
    public Users setRichEditing(String richEditing) {
        Usermeta meta = new Usermeta();
        meta.setRichEditing(richEditing);
        meta.setUserId(getID());
        metas.add(meta);
        return this;
    }

    /**
     * 设置语法高亮
     */
    public Users setSyntaxHighlighting(String syntaxHighlighting) {
        Usermeta meta = new Usermeta();
        meta.setSyntaxHighlighting(syntaxHighlighting);
        meta.setUserId(getID());
        metas.add(meta);
        return this;
    }

    /**
     * 设置评论快捷键
     */
    public Users setCommentShortcuts(String commentShortcuts) {
        Usermeta meta = new Usermeta();
        meta.setCommentShortcuts(commentShortcuts);
        meta.setUserId(getID());
        metas.add(meta);
        return this;
    }

    /**
     * 设置管理颜色
     */
    public Users setAdminColor(String adminColor) {
        Usermeta meta = new Usermeta();
        meta.setAdminColor(adminColor);
        meta.setUserId(getID());
        metas.add(meta);
        return this;
    }

    /**
     * 设置使用SSL
     */
    public Users setUseSSL(String useSSL) {
        Usermeta meta = new Usermeta();
        meta.setUseSSL(useSSL);
        meta.setUserId(getID());
        metas.add(meta);
        return this;
    }

    /**
     * 设置前台显示管理栏
     */
    public Users setShowAdminBarFront(String showAdminBarFront) {
        Usermeta meta = new Usermeta();
        meta.setShowAdminBarFront(showAdminBarFront);
        meta.setUserId(getID());
        metas.add(meta);
        return this;
    }

    /**
     * 设置区域设置
     */
    public Users setLocale(String locale) {
        Usermeta meta = new Usermeta();
        meta.setLocale(locale);
        meta.setUserId(getID());
        metas.add(meta);
        return this;
    }

    /**
     * 设置角色
     */
    public Users setRole(String role) {
        Usermeta meta = new Usermeta();
        meta.setRole(role);
        meta.setUserId(getID());
        metas.add(meta);
        return this;
    }

    /**
     * 设置权限
     */
    public Users setPermissions(Object...permissions) throws Exception {
        Usermeta meta = new Usermeta();
        meta.setPermissions(permissions);
        meta.setUserId(getID());
        metas.add(meta);
        return this;
    }

    /**
     * 设置WordPress能力
     */
    public Users setWpCapabilities(Object...capabilities) throws Exception {
        Usermeta meta = new Usermeta();
        meta.setWpCapabilities(capabilities);
        meta.setUserId(getID());
        metas.add(meta);
        return this;
    }

    /**
     * 设置用户等级
     */
    public Users setWpUserLevel(String wpUserLevel) {
        Usermeta meta = new Usermeta();
        meta.setWpUserLevel(wpUserLevel);
        meta.setUserId(getID());
        metas.add(meta);
        return this;
    }

    /**
     * 设置忽略的WordPress指针
     */
    public Users setDismissedWpPointers(String dismissedWpPointers) {
        Usermeta meta = new Usermeta();
        meta.setDismissedWpPointers(dismissedWpPointers);
        meta.setUserId(getID());
        metas.add(meta);
        return this;
    }

    /**
     * 设置本地头像
     */
    public Users setSimpleLocalAvatar(String simpleLocalAvatar) {
        Usermeta meta = new Usermeta();
        meta.setSimpleLocalAvatar(simpleLocalAvatar);
        meta.setUserId(getID());
        metas.add(meta);
        return this;
    }

    // ========== 业务方法 ==========

    /**
     * 获取用户元数据
     */
    public List<Usermeta> getMetas() {
        return metas;
    }

    /**
     * 验证用户基本信息
     */
    public boolean validateBasicInfo() {
        return validateRequired("user_login", "用户名") &&
                validateRequired("user_email", "邮箱") &&
                validateEmail("user_email", "邮箱") &&
                validateLength("user_login", "用户名", 3, 60) &&
                validateLength("user_email", "邮箱", 5, 100);
    }

    /**
     * 获取用户显示名称
     */
    public String getDisplayNameSafely() {
        return getStrSafely("display_name", getStrSafely("user_login", "未知用户"));
    }

    /**
     * 获取用户邮箱（隐藏敏感信息）
     */
    public String getEmailHidden() {
        String email = getStr("user_email");
        return hideSensitiveInfo(email, 3, 3);
    }

    /**
     * 转换为安全的数据Map（排除密码等敏感信息）
     */
    public java.util.Map<String, Object> toSafeMap() {
        return toMap("user_pass", "session_tokens");
    }
}